<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>

<body>
  <script>
    Function.prototype.myCall = function (context, ...arg) {
      // 首先判断context的类型
      if (context === null || context === undefined) {
        context = window
      }
      if (context !== "object" && context !== "function") {
        context = Object(context)
      }

      // 目标:调用fn 改变fn的this指向{} 返回fn函数的返回值
      // 要拿到fn:myCall函数里的this指向即为fn,因为myCall在Function的原型对象上,所以这个方法只有函数能拿去用,fn.myCall拿到,myCall函数里的this指向即为fn
      // 给context添加一个属性,值为this,但可能会覆盖本来的属性,所以要添加一个独一无二的属性
      const sy1 = Symbol("sy1")
      context[sy1] = this
      // 调用sy1,fn函数里的this指向即为context,fn函数的返回值交给re
      const re = context[sy1](...arg)
      // 返回re
      return re
    }


    function fn(a, b) {
      console.log(this, a + b);
      return 1
    }

    const re = fn.myCall({}, 1, 2)
    console.log(re);
  </script>
</body>

</html>